تطبيق عملي لتعلم جانغو – الجزء الثاني: استخدام النماذج (Models)
تعتبر النماذج (Models) في Django واحدة من أهم المفاهيم الأساسية التي يجب على كل مطور فهمها بشكل عميق عند العمل مع هذا الإطار البرمجي. في الجزء الأول من هذا المقال، تم استعراض مفهوم Django بشكل عام وبعض خصائصه الأساسية، وفي هذا الجزء سنتناول بشكل موسع كيفية التعامل مع النماذج في Django، وكيفية استخدامها لإنشاء قواعد بيانات ديناميكية ومرنة في تطبيقات الويب.
1. ما هي النماذج في Django؟
النماذج (Models) في Django هي عبارة عن فئة (class) تمثل بنية بيانات محددة في قاعدة البيانات. كل نموذج في Django يعكس جدولًا في قاعدة البيانات، وكل خاصية داخل النموذج تمثل عمودًا في ذلك الجدول. كما أن النماذج في Django تُستخدم لتحديد كيفية تخزين البيانات في قاعدة البيانات وكذلك كيفية التعامل معها من خلال تطبيق Django. من خلال النماذج، يتمكن المطورون من إجراء عمليات CRUD (إنشاء، قراءة، تحديث، وحذف) على البيانات بشكل سهل وفعال دون الحاجة للكتابة يدويًا لاستعلامات SQL.
2. بنية النموذج في Django
لنفترض أن لدينا تطبيقًا لإدارة الكتب. يمكننا إنشاء نموذج يمثل الكتاب في قاعدة البيانات. النموذج سيكون فئة (class) في ملف models.py داخل تطبيق Django.
pythonfrom django.db import models
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=100)
published_date = models.DateField()
isbn_number = models.CharField(max_length=13)
genre = models.CharField(max_length=50)
def __str__(self):
return self.title
شرح الكود:
-
class Book(models.Model): هذه هي الفئة التي تمثل النموذج “Book”. الميراث من
models.Modelيتيح للنموذج التعامل مع قاعدة البيانات. -
title, author, published_date, isbn_number, genre: هذه هي الحقول التي تمثل الأعمدة في جدول قاعدة البيانات الخاص بالكتب. تتنوع أنواع الحقول التي تقدمها Django مثل
CharFieldللنصوص القصيرة وDateFieldللتواريخ. -
def str(self): هذه الدالة تقوم بتحديد كيف يجب أن يظهر الكائن في واجهات الإدارة أو عند طباعة الكائن.
3. أنواع الحقول في النماذج
تحتوي Django على مجموعة من أنواع الحقول التي تسمح بتخزين أنواع مختلفة من البيانات في قاعدة البيانات. وفيما يلي بعض الأنواع الأكثر شيوعًا:
-
CharField: لتخزين نصوص قصيرة مثل العناوين أو الأسماء.
-
TextField: لتخزين نصوص طويلة مثل الوصف.
-
IntegerField: لتخزين الأعداد الصحيحة.
-
DecimalField: لتخزين الأعداد العشرية.
-
FloatField: لتخزين الأعداد العشرية ذات الفاصلة العائمة.
-
BooleanField: لتخزين القيم المنطقية (صح أو خطأ).
-
DateField & DateTimeField: لتخزين التواريخ والأوقات.
-
ForeignKey: لتخزين العلاقة بين الجداول، بحيث يكون هذا الحقل مفتاحًا أجنبيًا يشير إلى نموذج آخر.
مثال آخر باستخدام أنواع مختلفة من الحقول:
pythonclass Author(models.Model):
name = models.CharField(max_length=100)
birth_date = models.DateField()
nationality = models.CharField(max_length=50)
class Book(models.Model):
title = models.CharField(max_length=200)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
published_date = models.DateField()
isbn_number = models.CharField(max_length=13)
genre = models.CharField(max_length=50)
في هذا المثال، تم إضافة نموذج Author الذي يحتوي على حقول للاسم، تاريخ الميلاد، والجنسية. كما أضفنا علاقة من نوع ForeignKey في نموذج Book تشير إلى المؤلف الذي كتب الكتاب.
4. التعامل مع قواعد البيانات باستخدام النماذج
عند إنشاء النماذج وتحديد الحقول، تحتاج إلى تفعيل التغييرات في قاعدة البيانات. للقيام بذلك، يجب عليك أولاً إنشاء الهجرة (migration) الخاصة بتغييرات النموذج، ثم تطبيق هذه الهجرة على قاعدة البيانات.
إنشاء الهجرات:
لتوليد ملف الهجرة، يمكنك استخدام الأمر التالي في سطر الأوامر:
bashpython manage.py makemigrations
سيقوم Django بإنشاء ملف هجرة يحتوي على تعليمات لتعديل قاعدة البيانات بناءً على التغييرات التي أُجريت على النماذج.
تطبيق الهجرات:
لتطبيق الهجرة على قاعدة البيانات، يمكنك استخدام الأمر التالي:
bashpython manage.py migrate
سيقوم هذا الأمر بتنفيذ التغييرات المقررة في قاعدة البيانات، مثل إضافة الجداول أو تعديل الحقول.
5. إدارة البيانات باستخدام Django Shell
Django يوفر واجهة تفاعلية (shell) يمكنك من خلالها التعامل مع النماذج مباشرة. للدخول إلى هذه الواجهة، استخدم الأمر التالي:
bashpython manage.py shell
بمجرد أن تكون في الـ shell، يمكنك إنشاء سجلات جديدة، تحديث السجلات الحالية، أو حتى حذفها.
إنشاء سجل جديد:
pythonfrom myapp.models import Book, Author
author = Author.objects.create(name="J.K. Rowling", birth_date="1965-07-31", nationality="British")
book = Book.objects.create(title="Harry Potter and the Philosopher's Stone", author=author, published_date="1997-06-26", isbn_number="9780747532743", genre="Fantasy")
قراءة السجلات:
pythonbooks = Book.objects.all() # جلب جميع الكتب
book = Book.objects.get(id=1) # جلب الكتاب الذي يحتوي على id = 1
تحديث السجلات:
pythonbook = Book.objects.get(id=1)
book.title = "Harry Potter and the Sorcerer's Stone"
book.save() # حفظ التغييرات
حذف السجلات:
pythonbook = Book.objects.get(id=1)
book.delete() # حذف السجل
6. الفلاتر (Filters) والبحث في البيانات
يمكنك استخدام فلاتر لتحديد البيانات التي تريد جلبها من قاعدة البيانات. توفر Django العديد من الأدوات المدمجة التي تتيح لك تصفية السجلات وفقًا للعديد من الشروط.
مثال على استخدام الفلاتر:
python# جلب جميع الكتب التي تم نشرها بعد عام 2000
books = Book.objects.filter(published_date__year__gte=2000)
# جلب الكتاب الذي يحتوي على نوع "Fantasy"
books = Book.objects.filter(genre="Fantasy")
7. العلاقات بين النماذج
تُعتبر العلاقات بين النماذج من الجوانب الأساسية في Django. هناك ثلاث أنواع رئيسية للعلاقات بين النماذج:
-
علاقة One-to-One (OneToOneField): يتم استخدامها عندما يكون هناك ارتباط بين نموذجين بحيث كل سجل في النموذج الأول يرتبط بسجل واحد فقط في النموذج الثاني.
-
علاقة One-to-Many (ForeignKey): هذا هو النوع الأكثر شيوعًا في Django، حيث يرتبط سجل واحد من نموذج ما بعدد من السجلات في نموذج آخر. تمثل العلاقة بين المؤلف والكتاب مثالاً جيدًا على هذه العلاقة.
-
علاقة Many-to-Many (ManyToManyField): يُستخدم هذا النوع عندما يكون هناك ارتباط بين عدة سجلات في نموذج واحد مع عدة سجلات في نموذج آخر.
مثال على علاقة Many-to-Many:
pythonclass Book(models.Model):
title = models.CharField(max_length=200)
authors = models.ManyToManyField(Author)
# الآن يمكن للكتاب أن يحتوي على عدة مؤلفين، ويمكن للمؤلفين كتابة عدة كتب
8. إضافة النماذج إلى واجهة الإدارة
تتيح Django للمطورين إضافة النماذج إلى واجهة الإدارة بسهولة من خلال ملف admin.py. يمكن إضافة النماذج التي تم إنشاؤها للتو إلى واجهة الإدارة لتسهيل إدارة البيانات.
إضافة نموذج إلى واجهة الإدارة:
pythonfrom django.contrib import admin
from .models import Book, Author
admin.site.register(Book)
admin.site.register(Author)
بعد ذلك، عند تسجيل الدخول إلى واجهة الإدارة (عادة في localhost:8000/admin)، ستتمكن من إدارة الكتب والمؤلفين بسهولة.
9. استراتيجيات متقدمة في النماذج
إلى جانب العمليات الأساسية التي تمت مناقشتها، تقدم Django ميزات متقدمة لتحسين كيفية التعامل مع النماذج. يشمل ذلك استخدام الإشعارات (signals) للتحكم في العمليات التي تحدث عند إضافة أو تعديل أو حذف السجلات، واستخدام الواجهات البينية (abstract models) لإنشاء هياكل مرنة وإعادة استخدامها عبر عدة نماذج.
مثال على استخدام signals:
pythonfrom django.db.models.signals import pre_save
from django.dispatch import receiver
@receiver(pre_save, sender=Book)
def check_isbn(sender, instance, **kwargs):
if len(instance.isbn_number) != 13:
raise ValueError("ISBN number must be 13 characters long")
في هذا المثال، قمنا بإضافة إشارة للتحقق من أن رقم ISBN يحتوي على 13 حرفًا قبل أن يتم حفظ الكتاب.
10. الخاتمة
النماذج في Django هي جزء أساسي من بناء التطبيقات الحديثة على هذا الإطار البرمجي، فهي توفر طريقة مرنة وقوية للعمل مع قواعد البيانات بدون الحاجة لكتابة استعلامات SQL يدويًا. من خلال النماذج، يمكنك تنظيم البيانات بشكل منطقي وسهل، إضافة العلاقات بين الجداول، وإجراء عمليات معقدة بكل بساطة.
في هذا الجزء، قمنا بتغطية العديد من الجوانب المهمة للنماذج في Django، من إنشاء النماذج إلى إدارة العلاقات بين النماذج، والتفاعل مع البيانات من خلال واجهة الإدارة. يعتبر هذا المقال نقطة انطلاق جيدة للمطورين الذين يرغبون في بناء تطبيقات ويب ديناميكية باستخدام Django.

